﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using com.zjgis.utility;
using System.Diagnostics;


namespace ConsoleApplication1
{
    class Program
    {
        private string folder1;
        private string folder2;
        static void Main(string[] args)
        {
            Console.WriteLine("参数：sourcefilepath destfilepath *.jpg 4");
            Program p = new Program();
            p.folder1 = args[0];
            p.folder2 = args[1];
            string postfix = args[2];
            int threadcount = int.Parse(args[3]);

            string[] files = Directory.GetFiles(p.folder1, postfix, SearchOption.AllDirectories);
            
            p.filesArray = files.ToList<string>();
            for (int i = 0; i < threadcount; i++)
            {
                ThreadStart threadDelegate = new ThreadStart(p.DoWork);
                Thread newThread = new Thread(threadDelegate);
                newThread.Start();
            }
        }
        private List<string> filesArray = new List<string>();
        private string getnext(ref bool hasmore)
        {
            lock (lockThis)
            {
                hasmore = filesArray.Count != 0;
                if (!hasmore)
                    return "";
                string file = filesArray[0];
                filesArray.RemoveAt(0);
                return file;
            }
        }
        private static System.Object lockThis = new System.Object();
        public void DoWork()
        {
            bool hasmore = false;
            string file = getnext(ref hasmore);
            int i = 0;
            while (hasmore)
            {
                string file2 = file.Replace(folder1, folder2);
                if (!File.Exists(file2))
                {
                    FileHandler.CreateDirectory(Directory.GetParent(file2).FullName);
                    Thumbnail.GetThumbnail(file, file2, 256, 256);
                }
                i++;
                if (i >= 10000)
                {
                    ThreadStart threadDelegate = new ThreadStart(this.DoWork);
                    Thread newThread = new Thread(threadDelegate);
                    newThread.Start();
                    break;
                }
                hasmore = false;                
                file = getnext(ref hasmore);
            }
        }
    }

    public static class Thumbnail
    {        
        /// <SUMMARY>
        /// 图片缩放
        /// </SUMMARY>
        /// <PARAM name="sourceFile">图片源路径</PARAM>
        /// <PARAM name="destFile">缩放后图片输出路径</PARAM>
        /// <PARAM name="destHeight">缩放后图片高度</PARAM>
        /// <PARAM name="destWidth">缩放后图片宽度</PARAM>
        /// <RETURNS></RETURNS>
        public static bool GetThumbnail(string sourceFile, string destFile, int destHeight, int destWidth)
        {
            System.Drawing.Image imgSource = System.Drawing.Image.FromFile(sourceFile);
            System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
            int sW = 0, sH = 0;
            // 按比例缩放
            int sWidth = imgSource.Width;
            int sHeight = imgSource.Height;

            if (sHeight > destHeight || sWidth > destWidth)
            {
                if ((sWidth * destHeight) > (sHeight * destWidth))
                {
                    sW = destWidth;
                    sH = (destWidth * sHeight) / sWidth;
                }
                else
                {
                    sH = destHeight;
                    sW = (sWidth * destHeight) / sHeight;
                }
            }
            else
            {
                sW = sWidth;
                sH = sHeight;
            }

            Bitmap outBmp = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage(outBmp);
            g.Clear(Color.Transparent);

            //// 设置画布的描绘质量
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBilinear;

            g.DrawImage(imgSource,0,0,destWidth, destHeight);
            g.Dispose();

            // 以下代码为保存图片时，设置压缩质量
            EncoderParameters encoderParams = new EncoderParameters();
            long[] quality = new long[1];
            quality[0] = 100;

            EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            encoderParams.Param[0] = encoderParam;

            try
            {
                //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICI = null;
                for (int x = 0; x < arrayICI.Length; x++)
                {
                    if (arrayICI[x].FormatDescription.Equals("JPEG"))
                    {
                       jpegICI = arrayICI[x];//设置JPEG编码
                        break;
                    }
                }

                if (jpegICI != null)
                {
                    outBmp.Save(destFile, jpegICI, encoderParams);
                    jpegICI = null;
                }
                else
                {
                    outBmp.Save(destFile, thisFormat);
                }
                encoderParam.Dispose();
                encoderParam = null;
                encoderParams.Dispose();
                encoderParams = null;                
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            finally
            {
                imgSource.Dispose();
                outBmp.Dispose();
                g.Dispose();
                imgSource = null;
                outBmp = null;
                g = null;
                thisFormat = null;
            }
        }
    }
}

